// JavaScript 原有的表示“集合”的数据结构，主要是数组（Array）和对象（Object），ES6 又添加了Map和Set。这样就有了四种数据集合，用户还可以组合使用它们，定义自己的数据结构，比如数组的成员是Map，Map的成员是对象。这样就需要一种统一的接口机制，来处理所有不同的数据结构。

// 遍历器（Iterator）就是这样一种机制。它是一种接口，为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口，就可以完成遍历操作（即依次处理该数据结构的所有成员）。 for - of

// Iterator 的作用有三个：一是为各种数据结构，提供一个统一的、简便的访问接口；二是使得数据结构的成员能够按某种次序排列；三是 ES6 创造了一种新的遍历命令for...of循环，Iterator 接口主要供for...of消费。

// const arr = ['a', 'b', 'c', 'd']
// const str = '12345'

// for(const value of arr) {
//   console.log(value)
// }

// for(const value of str) {
//   console.log(value)
// }


// for(const value of 10) {
//   console.log(value)
// }


// 模拟遍历器
// const arr = ['A', 'B', 'C', 'D', "E"]




function makeArr() {
  let i = 0; 
  const _that = this;
  return {
    next() {
      if(i >= _that.length) {
        return { value: undefined, done: true }
      }
      return { value: _that[i++], done: false }
    }
  }
}

// Array.prototype[Symbol.iterator] = makeArr

// for(const value of arr) {
//   console.log(value)
// }

// const t = makeArr(arr)
// const result1 = t.next() // 'A'
// const result2 = t.next() // 'B'
// const result3 = t.next() // 'C'
// const result4 = t.next() // 'D'
// const result5 = t.next() // 'E'
// const result6 = t.next() 


// console.log(result1)
// console.log(result2)
// console.log(result3)
// console.log(result4)
// console.log(result5)
// console.log(result6)

// Number.prototype[Symbol.iterator] = function() {
//   let i = 1;
//   return {
//     next: () =>  {
//       if(i > this) {
//         return  { value: undefined, done: true }
//       }
//       return { value: i++, done: false }
//     }
//   }
// }


// for(let i of 100) {
//   console.log(i)
// }